﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Enum;
using Sinacor.Servico.Bovespa.Ordens;
using Sinacor.Infra.Service.Common;
using System.Linq;

namespace Sinacor.Servico.Bovespa.Ordens.BusinessLogic
{
    public class LoteDigitacao : BaseBusinessLogic
    {
        private const int Erro_Digitacao_Multipla = 109035;

        /// <summary>
        /// Consultar Lote Digitacao Multiplos Lotes
        /// </summary>
        /// <param name="pLoteDigitacao"></param>
        /// <returns></returns>
        public bool ConsultarLoteDigitacaoMultiplo(List<BusinessEntity.Parameter.ConsultarLoteDigitacao> pLoteDigitacao)
        {
            ResourceAccess.LoteDigitacao distr = new ResourceAccess.LoteDigitacao();
            return distr.ConsultarLoteDigitacaoMultiplo(pLoteDigitacao);
        }
        public bool Inserir(List<BusinessEntity.LoteDigitacao> pListLoteDigitacao)
        {
            //
            BusinessLogic.Negocio validarEstadoSistema = new Negocio();
            validarEstadoSistema.ValidarEstadoSistema(Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Enum.ModuloChamador.ControleOrdens);
            ResourceAccess.LoteDigitacao rsLoteDigitacao = new ResourceAccess.LoteDigitacao();

            //
            if (pListLoteDigitacao == null || pListLoteDigitacao.Count == 0)
                throw new BusinessException(0);

            if (ValidarCliente(pListLoteDigitacao) == false)
                return false;

            for (int i = 0; i < pListLoteDigitacao.Count; i++)
            {
                rsLoteDigitacao.Inserir(pListLoteDigitacao[i]);
            }

            IEnumerable<long> numConjunto = (from lote in pListLoteDigitacao select lote.NumeroConjunto).Distinct();

            foreach (long item in numConjunto)
            {
                pListLoteDigitacao[0].NumeroConjunto = item;

                switch (pListLoteDigitacao[0].TipoDistribuicao)
                {
                    case BusinessEntity.Enum.TipoDistribuicao.Direto:                        
                        rsLoteDigitacao.ExecutarDistribuicaoPreco(pListLoteDigitacao[0]);
                        break;                        
                    case BusinessEntity.Enum.TipoDistribuicao.PrecoMedioPorVolume:                        
                        rsLoteDigitacao.ExecutarDistribuicaoPrecoPorVolume(pListLoteDigitacao[0]);
                        break;                        
                    case BusinessEntity.Enum.TipoDistribuicao.PrecoMedio:                        
                        rsLoteDigitacao.ExecutarDistribuicaoPrecoMedio(pListLoteDigitacao[0]);
                        break;                        
                    case BusinessEntity.Enum.TipoDistribuicao.Percentual:                        
                        rsLoteDigitacao.ExecutarDistribuicaoPercentual(pListLoteDigitacao[0]);
                        break;                        
                }
            }

            return true;
        }
        public List<BusinessEntity.LoteDigitacao> ConsultarLoteDigitacao(BusinessEntity.Parameter.ConsultarLoteDigitacao pConsultarLoteDigitacao)
        {
            ResourceAccess.LoteDigitacao rsLoteDigitacao = new ResourceAccess.LoteDigitacao();

            if (pConsultarLoteDigitacao.NumeroConjunto == 0)
                throw new Exception();

            return rsLoteDigitacao.ConsultarLoteDigitacao(pConsultarLoteDigitacao);
        }
        private bool ValidarCliente(List<BusinessEntity.LoteDigitacao> pListLoteDigitacao)
        {
            bool retorno;
            retorno = true;

            foreach (BusinessEntity.LoteDigitacao itemLoteDigitacao in pListLoteDigitacao)
            {
                if (retorno == false)
                    break;
            }
            return retorno;
        }

        /*  WAbreu.7COMm
         *  TASK 1289
            recebe uma lista de Parameter.ExcluirLoteDigitacao

            Varre a lista e chama o metodo Excluir da ResourceAccess.LoteDigitacao

            depois de ter excluido a lista toda, então deve-se chamar um dos metodos abaixo:
            (Levando em o conta a propriedade TipoDistribuicao de Parameter.ExcluirLoteDigitacao)
            Se distribuição Direto
            ExecutaDistribuicaoPreco
            Se distribuição Preço Médio
               Se distribuição pelo Volume
            ExecutaDistribuicaoPrecoMedioPorVolume
               Caso contrário
            ExecutaDistribuicaoPrecoMedio
            Se distribuição Percentual
            ExecutaDistribuicaoPercentual
            Para o parametro esperado em todos os metodos acima, deve-se passar o primeiro item da lista recebida.

            Para maiores detalhes consultar regra de negocio que fica na view
         */

        public bool Excluir(List<BusinessEntity.Parameter.ExcluirLoteDigitacao> pListExcluirLoteDigitacao)
        {
            BusinessLogic.Negocio validarEstadoSistema = new Negocio();
            validarEstadoSistema.ValidarEstadoSistema(Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Enum.ModuloChamador.ControleOrdens);

            Sinacor.Servico.Bovespa.Ordens.BusinessEntity.LoteDigitacao loteDigitacao = new Sinacor.Servico.Bovespa.Ordens.BusinessEntity.LoteDigitacao();

            ResourceAccess.LoteDigitacao distr = new ResourceAccess.LoteDigitacao();


            //if (pListExcluirLoteDigitacao.Count > 1)
            //{
            //    List<BusinessEntity.Parameter.ConsultarLoteDigitacao> plote = new List<Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Parameter.ConsultarLoteDigitacao>();
            //    foreach (BusinessEntity.Parameter.ExcluirLoteDigitacao pitem in pListExcluirLoteDigitacao)
            //    {
            //        BusinessEntity.Parameter.ConsultarLoteDigitacao parametro = new Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Parameter.ConsultarLoteDigitacao();
            //        parametro.NumeroConjunto = Convert.ToInt64(pitem.NumeroConjunto);

            //        plote.Add(parametro);

            //    }

            //    if (distr.ConsultarLoteDigitacaoMultiplo(plote))
            //        throw new BusinessException(Erro_Digitacao_Multipla);

            //}

            foreach (BusinessEntity.Parameter.ExcluirLoteDigitacao excluir in pListExcluirLoteDigitacao)
            {
                distr.Excluir(excluir);
            }

            loteDigitacao.DataMovimento = pListExcluirLoteDigitacao[0].DataOrdem;
            loteDigitacao.NumeroConjunto = pListExcluirLoteDigitacao[0].NumeroConjunto.Value;
            loteDigitacao.TipoDistribuicao = pListExcluirLoteDigitacao[0].TipoDistribuicao;

            switch (loteDigitacao.TipoDistribuicao)
            {
                case BusinessEntity.Enum.TipoDistribuicao.Direto:
                    distr.ExecutarDistribuicaoPreco(loteDigitacao);
                    break;

                case BusinessEntity.Enum.TipoDistribuicao.Percentual:
                    distr.ExecutarDistribuicaoPercentual(loteDigitacao);
                    break;

                case BusinessEntity.Enum.TipoDistribuicao.PrecoMedio:
                    distr.ExecutarDistribuicaoPrecoMedio(loteDigitacao);
                    break;

                case BusinessEntity.Enum.TipoDistribuicao.PrecoMedioPorVolume:
                    distr.ExecutarDistribuicaoPrecoPorVolume(loteDigitacao);
                    break;
            }

            return true;
        }
    }
}

